#!/usr/bin/env python3
"""
系统资源监控模块
负责监控系统资源使用情况，包括CPU、内存、磁盘等
"""

import os
import sys
import time
import psutil
import logging
from datetime import datetime
from typing import Dict, Any

# 配置日志
logger = logging.getLogger('ResourceMonitor')
logger.setLevel(logging.INFO)

class ResourceMonitor:
    """系统资源监控类"""
    def __init__(self):
        self.warning_thresholds = {
            'cpu': 80.0,  # CPU使用率警告阈值（%）
            'memory': 80.0,  # 内存使用率警告阈值（%）
            'disk': 80.0,  # 磁盘使用率警告阈值（%）
            'process_cpu': 50.0,  # 单进程CPU使用率警告阈值（%）
            'process_memory': 500.0  # 单进程内存使用警告阈值（MB）
        }
        self.critical_thresholds = {
            'cpu': 90.0,  # CPU使用率严重阈值（%）
            'memory': 90.0,  # 内存使用率严重阈值（%）
            'disk': 90.0,  # 磁盘使用率严重阈值（%）
            'process_cpu': 70.0,  # 单进程CPU使用率严重阈值（%）
            'process_memory': 1000.0  # 单进程内存使用严重阈值（MB）
        }
    
    def get_system_metrics(self) -> Dict[str, Any]:
        """获取系统资源使用指标"""
        try:
            # CPU使用率 - 使用interval=0.1减少等待时间
            cpu_percent = psutil.cpu_percent(interval=0.1)
            
            # 内存使用情况
            memory = psutil.virtual_memory()
            memory_percent = memory.percent
            memory_used = memory.used / (1024 * 1024)  # MB
            memory_total = memory.total / (1024 * 1024)  # MB
            
            # 磁盘使用情况 - 缓存磁盘总容量
            if not hasattr(self, '_disk_total'):
                disk = psutil.disk_usage('/')
                self._disk_total = disk.total / (1024 * 1024 * 1024)  # GB
            disk = psutil.disk_usage('/')
            disk_percent = disk.percent
            disk_used = disk.used / (1024 * 1024 * 1024)  # GB
            disk_total = self._disk_total  # 使用缓存的总容量
            
            return {
                'timestamp': datetime.now().isoformat(),
                'cpu': {
                    'percent': cpu_percent,
                    'status': self._get_status('cpu', cpu_percent)
                },
                'memory': {
                    'percent': memory_percent,
                    'used_mb': memory_used,
                    'total_mb': memory_total,
                    'status': self._get_status('memory', memory_percent)
                },
                'disk': {
                    'percent': disk_percent,
                    'used_gb': disk_used,
                    'total_gb': disk_total,
                    'status': self._get_status('disk', disk_percent)
                }
            }
        except Exception as e:
            logger.error(f"获取系统指标失败: {str(e)}")
            return None
    
    def get_process_metrics(self, pid: int) -> Dict[str, Any]:
        """获取指定进程的资源使用指标"""
        try:
            process = psutil.Process(pid)
            
            # 进程CPU使用率 - 使用interval=0.1减少等待时间
            process_cpu_percent = process.cpu_percent(interval=0.1)
            
            # 进程内存使用
            process_memory = process.memory_info().rss / (1024 * 1024)  # MB
            
            return {
                'timestamp': datetime.now().isoformat(),
                'pid': pid,
                'name': process.name(),
                'status': process.status(),
                'cpu': {
                    'percent': process_cpu_percent,
                    'status': self._get_status('process_cpu', process_cpu_percent)
                },
                'memory': {
                    'used_mb': process_memory,
                    'status': self._get_status('process_memory', process_memory)
                },
                'create_time': datetime.fromtimestamp(process.create_time()).isoformat(),
                'threads': process.num_threads()
            }
        except Exception as e:
            logger.error(f"获取进程指标失败: {str(e)}")
            return None
    
    def _get_status(self, metric: str, value: float) -> str:
        """根据指标值判断状态"""
        if value >= self.critical_thresholds[metric]:
            return 'critical'
        elif value >= self.warning_thresholds[metric]:
            return 'warning'
        return 'normal'
    
    def check_resource_usage(self) -> Dict[str, Any]:
        """检查资源使用情况并返回警告信息"""
        system_metrics = self.get_system_metrics()
        if not system_metrics:
            return {'status': 'error', 'message': '无法获取系统指标'}
        
        warnings = []
        
        # 检查CPU使用率
        if system_metrics['cpu']['status'] == 'critical':
            warnings.append(f"CPU使用率严重: {system_metrics['cpu']['percent']}%")
        elif system_metrics['cpu']['status'] == 'warning':
            warnings.append(f"CPU使用率警告: {system_metrics['cpu']['percent']}%")
        
        # 检查内存使用率
        if system_metrics['memory']['status'] == 'critical':
            warnings.append(f"内存使用率严重: {system_metrics['memory']['percent']}%")
        elif system_metrics['memory']['status'] == 'warning':
            warnings.append(f"内存使用率警告: {system_metrics['memory']['percent']}%")
        
        # 检查磁盘使用率
        if system_metrics['disk']['status'] == 'critical':
            warnings.append(f"磁盘使用率严重: {system_metrics['disk']['percent']}%")
        elif system_metrics['disk']['status'] == 'warning':
            warnings.append(f"磁盘使用率警告: {system_metrics['disk']['percent']}%")
        
        return {
            'status': 'critical' if any(w.startswith('严重') for w in warnings) else
                     'warning' if warnings else 'normal',
            'warnings': warnings,
            'metrics': system_metrics
        }